Case study Biblioshop - boeken- en detailpagina
We plaatsen de lijst van de boeken en de details van een boek op dezelfde pagina. Als je op een boek in de lijst klikt vergroot de tegel waarin het boek staat en worden de details getoond. Het volledige project kan je hier downloaden: biblioshop.zip.
Video
Probleemstelling
In het overzicht van de boeken op de boekenpagina tonen we:
- de afbeelding van de cover,
- de auteur en
- de titel.
Als je op het boek klikt worden de details getoond:
- afbeelding van de cover
- title
- subtitle
- author
- publication-date
- publisher
- category
- size
- number-of-pages
- price
- language
- product-code
- product-type
- product-full-type
- description
Oplossing
- HTML structuur
Op de Books pagina staan alle gegevens van het boek. De gegevens die in het overzicht getoond worden en de gegevens die in detail worden getoon. We zetten de overzicht gegevens in eenfigure
element en de detail gegevens in een div element van de klassedetail
:<article id="article4"> <figure> <a href="#article4"> <img src="https://media.standaardboekhandel.be/-/media/mdm/product/9780735611313/frontImagesLink.img" alt="cover van het boek Code geschreven door Charles Petzold"> <figcaption> <cite>Code</cite> <address>Charles Petzold</address> </figcaption> </a> </figure> <div class="detail"> <img src="https://media.standaardboekhandel.be/-/media/mdm/product/9780735611313/frontImagesLink.img" alt="cover van het boek Code geschreven door Charles Petzold"> <p class="title">Code</p> <p class="subtitle">The Hidden Language of Computer Hardware and Software</p> <p class="author">Charles Petzold</p> <p class="publication-date"><span>Verschijningsdatum:</span> 29/04/2003</p> <p class="publisher"><span>Uitgever:</span> MICROSOFT PRESS</p> <p class="category"><span>Categorie:</span> Non-fictie | Informatica | </p> <p class="size"><span>Afmetingen:</span> 160 mm x 230 mm</p> <p class="number-of-pages"><span>Aantal bladzijden:</span> 400</p> <p class="price"><span>Prijs:</span> € 33,95</p> <p class="language"><span>Taal:</span> Engels</p> <p class="product-code"><span>Productcode (EAN):</span> 9780735611313</p> <p class="product-type"><span>Type:</span> Boek</p> <p class="product-type-full"><span>Uitgave:</span> Paperback | Engels</p> <p class="description"><span>Bechrijving:</span> What do flashlights, the British invasion, black cats, and seesaws have to do with computers? In CODE, they show us the ingenious ways we manipulate language and invent new means of communicating with each other. And through CODE, we see how this ingenuity and our very human compulsion to communicate have driven the technological innovations of the past two centuries. Using everyday objects and familiar language systems such as Braille and Morse code, author Charles Petzold weaves an illuminating narrative for anyone who's ever wondered about the secret inner life of computers and other smart machines. It's a cleverly illustrated and eminently comprehensible story-and along the way, you'll discover you've gained a real context for understanding today's world of PCs, digital media, and the Internet. No matter what your level of technical savvy, CODE will charm you-and perhaps even awaken the technophile within.</p> </div> </article>
De HTML van de Books.html pagina vind je onderaan de pagina.
- CSS voor het overzicht
- Voor het overzicht van de boeken gaan we flexbox gebruiken. Het element waarin alle
article
elementen staan zal dus een flex-container zijn. We plaatsen allearticle
elementen in een div element van de klasseoverview
:<div class="overview"> <article></article> .... </div>
- Deze
div
kunnen we selecteren met de klassenselectoroverview
. We maken er een flex-container van en die moet even groot zijn als het ouderelement, desection
van de klasseshow-room
. We werken mobile first, dus voegen we de CSS toe voor de staande versie, o.a. kolom richting:.overview { width: 100%; height: 100%; display: flex; flex-direction: row; flex-wrap: wrap; justify-content: space-around; }
- In het overview worden de details niet getoond, dus zetten we het
display
attribuut van de klassedetail
opnone
. Dit geldt voor zowel staand als liggend scherm:.detail { display: none; }
- Nu maken we het
article
element op. Hetarticle
element is ook een flex-container en de elementen erin worden onder elkaar geplaatst:.overview>article { display: flex; flex-direction: column; flex-basis: 200px; flex-grow: 0; flex-shrink: 1; border: solid black 1px; padding: 1em; margin-top: 1em; }
- Nu nog de grootte van de afbeelding in het overzicht:
.overview>article img { width: 100%; /* even breed als article */ }
- En de tekst in de
figure
maken we iets kleiner:.overview>article figcaption { font-size: smaller; }
- En we plaatsen de naam van de auteur niet in schuinschrift:
.overview>article figcaption address { font-style: normal; }
- Voor het overzicht van de boeken gaan we flexbox gebruiken. Het element waarin alle
- CSS voor de detail view
- We maken de binnenkant van elke figure in article in een a element zodat je erop kunt klikken om de details te bekijken.
<figure> <a href="#article1"> <img src="https://media.standaardboekhandel.be/-/media/mdm/product/9789082934915/frontImagesLink.img" alt="cover van het boek Inleiding UML geschreven door Hendrik Jan van Randen"> <figcaption> <cite>Inleiding UML</cite> <address>Hendrik Jan van Randen</address> </figcaption> </a> </figure>
- De url van de link is een bladwijzer naar een artikel nummer. Dus moeten we een elk artikel een
id
attribuut meegeven met als waarde het artikel nummer:<article id="article1">
- Een volledig artikel ziet er nu zo uit:
<article id="article1"> <figure> <a href="#article1"> <img src="https://media.standaardboekhandel.be/-/media/mdm/product/9780791417805/frontImagesLink.img" alt="cover van het boek Dbase-From the Dot Prompt geschreven door Warren M Littlefield"> <figcaption> <cite>Dbase-From the Dot Prompt</cite> <address>Warren M Littlefield</address> </figcaption> </a> </figure> <div class="detail"> ... </div> </article>
- Als er op een figure wordt geklikt willen we de details tonen. We gebruiken daarvoor de :target pseudoklasse van CSS. Daarmee kunnen we een CSS regel opstellen die moet worden uitgevoerd als er op een element geklikt wordt.
- We willen de lay-out van het overzicht verbergen, namelijk heel het
figure
element:article:target > figure { display:none; }
Je leest dit als volgt: als er oparticle
geklikt wordt verberg dan hetfigure
element dat inarticle
staat. -
Vervolgens moeten we de detail-div tonen want die staat ingesteld op
display:none
. Als er article geklikt wordt maak de detail-div die in hetarticle
staat zichtbaar:article:target > div.detail { display:block; }
-
Tenslotte maken we het geselecteerde
article
breder:article:target { flex-basis: 600px; }
We moeten hier geen media-query voorzien, omdat we de
flex-shrink
eigenschap ingesteld heben op 1.
- We willen de lay-out van het overzicht verbergen, namelijk heel het
- Als we de pagina in de browser bekijken zien we dit:
- We maken de binnenkant van elke figure in article in een a element zodat je erop kunt klikken om de details te bekijken.
- We moeten nu nog de volgende punten bijwerken:
- Staand formaat: afbeelding in de detail-div (juiste selector kiezen) verkleinen en in het midden van de kolom tonen:
article > div.detail > img { width: 60%; margin: 0 20%; }
- Liggend formaat: afbeelding in de detail-div verkleinen en links van de tekst laten zweven voor liggend beeldscherm. Ik plaats alle media-query's altijd helemaal aan het einde van het CSS bestand in een blok, zodat ze de relevante stijlregels hogerop in de CSS overschreven kunnen worden.:
@media (min-width: 800px) { ... article > div.detail > img { width: 12rem; margin: 0 5% 0 0; float: left; } }
- De beschrijving en de ondertitel zetten we in een kleiner lettertype:
div.detail .description, div.detail .subtitle { font-size: smaller; }
- De labels zetten we in het grijs:
div.detail p span { color: darkgrey; }
- En de kaders niet meer rond
article
maar rond figure endiv.detail
, evenals depadding
hier verwijderen en bijfigure
endiv.detail
plaatsen:.overview>article { display: flex; flex-basis: 200px; flex-grow: 0; flex-shrink: 1; flex-direction: column;
en deborder: solid black 1px; padding: 1em;margin-top: 1em; }border
en een beetje witruimte (padding
) toevoegen aanfigure
:.overview article figure { border: solid black 1px; padding: 0.5em; }
en aandiv.detail
:.detail { display: none; border: solid black 1px; padding: 0.5em; }
- Staand formaat: afbeelding in de detail-div (juiste selector kiezen) verkleinen en in het midden van de kolom tonen:
2020-11-22 18:29:56